

producer_i() {   // 生产者 i
    ...
    produce an item in next_produced;
    ...
    P(mutex);   // 互斥访问修改缓冲区
    P(empty);   // 缓冲区没有空单元，则阻塞
    ...
    add next_produced to the buffer
    V(mutex);
    V(full);    // 通知消费者，可以从缓冲区取一个产品
}

consumer_i {    // 消费者 i
    P(full);    // 缓冲区没有非空单元，则阻塞
    P(mutex);   // 互斥访问修改缓冲区
    ...
    remove an item from buffer to next_consumed;
    ...
    V(mutex);
    V(empty);   // 通知生产者，可以放一个产品到缓冲区
    ...
    consume the item in next_consumed;
    ...
}


